{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 对活动进行聚类\n",
    "\n",
    "问题描述：  \n",
    "根据活动的关键词（count_1, count_2, ..., count_100，count_other属性）做聚类，可采用KMeans聚类，尝试K=10，20，30，..., 100, 并计算各自CH_scores。\n",
    "总体活动的数目太多（300w+记录），只需对训练集train.csv和测试集test.cv出现的活动（13418条记录）进行聚类。\n",
    "\n",
    "作业要求：\n",
    "1. 抽取出只在训练集和测试集中出现的event \n",
    "2. 聚类  \n",
    "3. CH_scores计算 \n",
    "4. 结果显示/分析 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 读取数据，抽取出只在训练集和测试集中出现的event"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import metrics\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总的事件个数： 13418\n"
     ]
    }
   ],
   "source": [
    "# 读取训练集train.csv和测试集test.cv出现的活动\n",
    "\n",
    "dtrain = pd.read_csv('train.csv')\n",
    "dtest = pd.read_csv('test.csv')\n",
    "\n",
    "train_events = dtrain['event'] \n",
    "test_events = dtest['event'] \n",
    "\n",
    "total_events = set(set(train_events) | set(test_events))\n",
    "total_events = list(total_events)\n",
    "\n",
    "print('总的事件个数：',len(total_events))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of uniqueEvents :13418\n"
     ]
    }
   ],
   "source": [
    "uniqueEvents = set()\n",
    "\n",
    "for filename in [\"train.csv\", \"test.csv\"]:\n",
    "    f = open(filename, 'r',encoding='UTF-8')\n",
    "    \n",
    "    #忽略第一行（列名字）\n",
    "    f.readline().strip().split(\",\")\n",
    "    for line in f:\n",
    "        cols = line.strip().split(\",\")\n",
    "        uniqueEvents.add(cols[1])\n",
    "        \n",
    "        \n",
    "    f.close()\n",
    "\n",
    "\n",
    "n_uniqueEvents = len(uniqueEvents)  #一共有多少个   \n",
    "print(\"number of uniqueEvents :%d\" % n_uniqueEvents)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "两种方法都用下，熟悉下代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取文件'events.csv'，用linecache读文件很快\n",
    "\n",
    "import linecache  \n",
    "events = linecache.getlines(\"events.csv\") "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>city</th>\n",
       "      <th>state</th>\n",
       "      <th>zip</th>\n",
       "      <th>country</th>\n",
       "      <th>lat</th>\n",
       "      <th>lng</th>\n",
       "      <th>c_1</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>3647864012</td>\n",
       "      <td>2012-10-31T00:00:00.001Z</td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>3476440521</td>\n",
       "      <td>2012-11-03T00:00:00.001Z</td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>517514445</td>\n",
       "      <td>2012-11-05T00:00:00.001Z</td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>781585781</td>\n",
       "      <td>2012-10-30T00:00:00.001Z</td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1016098580</td>\n",
       "      <td>2012-09-27T00:00:00.001Z</td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td></td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 110 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id     user_id                start_time city state zip country  \\\n",
       "0   684921758  3647864012  2012-10-31T00:00:00.001Z                          \n",
       "1   244999119  3476440521  2012-11-03T00:00:00.001Z                          \n",
       "2  3928440935   517514445  2012-11-05T00:00:00.001Z                          \n",
       "3  2582345152   781585781  2012-10-30T00:00:00.001Z                          \n",
       "4  1051165850  1016098580  2012-09-27T00:00:00.001Z                          \n",
       "\n",
       "  lat lng c_1   ...   c_92 c_93 c_94 c_95 c_96 c_97 c_98 c_99 c_100 c_other  \n",
       "0           2   ...      0    1    0    0    0    0    0    0     0       9  \n",
       "1           2   ...      0    0    0    0    0    0    0    0     0       7  \n",
       "2           0   ...      0    0    0    0    0    0    0    0     0      12  \n",
       "3           1   ...      0    0    0    0    0    0    0    0     0       8  \n",
       "4           1   ...      0    0    0    0    0    0    0    0     0       9  \n",
       "\n",
       "[5 rows x 110 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用linecache读取的格式是列表格式的，再转换为dataframe格式\n",
    "\n",
    "columns=events[0].strip().split(',')   # 首行标题行\n",
    "\n",
    "data=[]\n",
    "for e in events[1:100001]:            # 这里读10万个数据，读全部的数据太慢了，电脑实在太卡啦\n",
    "    e=e.strip().split(',')\n",
    "    data.append(e)\n",
    "\n",
    "events_data=pd.DataFrame(data=data,columns=columns)\n",
    "events_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把文件‘events.csv’中的前10万个数据保存在新文件‘events_10w.csv’中\n",
    "\n",
    "events_data.to_csv('events_10w.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100000, 110)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取新文件‘events_10w.csv’ \n",
    "\n",
    "events_data=pd.read_csv('events_10w.csv').drop('Unnamed: 0',axis=1)\n",
    "\n",
    "events_data.shape "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>city</th>\n",
       "      <th>state</th>\n",
       "      <th>zip</th>\n",
       "      <th>country</th>\n",
       "      <th>lat</th>\n",
       "      <th>lng</th>\n",
       "      <th>c_1</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>3647864012</td>\n",
       "      <td>2012-10-31T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>3476440521</td>\n",
       "      <td>2012-11-03T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>517514445</td>\n",
       "      <td>2012-11-05T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>781585781</td>\n",
       "      <td>2012-10-30T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1016098580</td>\n",
       "      <td>2012-09-27T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 110 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id     user_id                start_time city state  zip country  \\\n",
       "0   684921758  3647864012  2012-10-31T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "1   244999119  3476440521  2012-11-03T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "2  3928440935   517514445  2012-11-05T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "3  2582345152   781585781  2012-10-30T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "4  1051165850  1016098580  2012-09-27T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "\n",
       "   lat  lng  c_1   ...     c_92  c_93  c_94  c_95  c_96  c_97  c_98  c_99  \\\n",
       "0  NaN  NaN    2   ...        0     1     0     0     0     0     0     0   \n",
       "1  NaN  NaN    2   ...        0     0     0     0     0     0     0     0   \n",
       "2  NaN  NaN    0   ...        0     0     0     0     0     0     0     0   \n",
       "3  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "4  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "\n",
       "   c_100  c_other  \n",
       "0      0        9  \n",
       "1      0        7  \n",
       "2      0       12  \n",
       "3      0        8  \n",
       "4      0        9  \n",
       "\n",
       "[5 rows x 110 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "events_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>c_1</th>\n",
       "      <th>c_2</th>\n",
       "      <th>c_3</th>\n",
       "      <th>c_4</th>\n",
       "      <th>c_5</th>\n",
       "      <th>c_6</th>\n",
       "      <th>c_7</th>\n",
       "      <th>c_8</th>\n",
       "      <th>c_9</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 102 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id  c_1  c_2  c_3  c_4  c_5  c_6  c_7  c_8  c_9   ...     c_92  \\\n",
       "0   684921758    2    0    2    0    0    0    0    0    0   ...        0   \n",
       "1   244999119    2    0    2    0    0    0    0    0    0   ...        0   \n",
       "2  3928440935    0    0    0    0    0    0    0    0    0   ...        0   \n",
       "3  2582345152    1    0    2    1    0    0    0    0    0   ...        0   \n",
       "4  1051165850    1    1    0    0    0    0    0    2    0   ...        0   \n",
       "\n",
       "   c_93  c_94  c_95  c_96  c_97  c_98  c_99  c_100  c_other  \n",
       "0     1     0     0     0     0     0     0      0        9  \n",
       "1     0     0     0     0     0     0     0      0        7  \n",
       "2     0     0     0     0     0     0     0      0       12  \n",
       "3     0     0     0     0     0     0     0      0        8  \n",
       "4     0     0     0     0     0     0     0      0        9  \n",
       "\n",
       "[5 rows x 102 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从文件'events.csv'中抽取出只在训练集和测试集中出现的event  \n",
    "# 文件‘events.csv’中的前10万个数据被保存在‘events_10w.csv’中，因此从文件'events_10w.csv’中抽取出只在训练集和测试集中出现的event  \n",
    "\n",
    "# 读取需要的标题：'event_id','c_1','c_2',..... \n",
    "col_all = list(events_data.columns) \n",
    "col_events = [col_all[0]]\n",
    "\n",
    "for i in range(9,len(col_all)):\n",
    "    col_events.append(col_all[i])\n",
    "    \n",
    "    \n",
    "\n",
    "# 把训练集和测试集总共13418个事件转化为dataframe格式\n",
    "total_events = pd.DataFrame(data=total_events,columns=['event'])\n",
    "#print(total_events)\n",
    " \n",
    "events_new = events_data.loc[events_data['event_id'].isin(total_events['event'])][col_events]\n",
    "events_new.to_csv('events_new.csv')\n",
    "\n",
    "events_new.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>c_1</th>\n",
       "      <th>c_2</th>\n",
       "      <th>c_3</th>\n",
       "      <th>c_4</th>\n",
       "      <th>c_5</th>\n",
       "      <th>c_6</th>\n",
       "      <th>c_7</th>\n",
       "      <th>c_8</th>\n",
       "      <th>c_9</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 102 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id  c_1  c_2  c_3  c_4  c_5  c_6  c_7  c_8  c_9   ...     c_92  \\\n",
       "0   684921758    2    0    2    0    0    0    0    0    0   ...        0   \n",
       "1   244999119    2    0    2    0    0    0    0    0    0   ...        0   \n",
       "2  3928440935    0    0    0    0    0    0    0    0    0   ...        0   \n",
       "3  2582345152    1    0    2    1    0    0    0    0    0   ...        0   \n",
       "4  1051165850    1    1    0    0    0    0    0    2    0   ...        0   \n",
       "\n",
       "   c_93  c_94  c_95  c_96  c_97  c_98  c_99  c_100  c_other  \n",
       "0     1     0     0     0     0     0     0      0        9  \n",
       "1     0     0     0     0     0     0     0      0        7  \n",
       "2     0     0     0     0     0     0     0      0       12  \n",
       "3     0     0     0     0     0     0     0      0        8  \n",
       "4     0     0     0     0     0     0     0      0        9  \n",
       "\n",
       "[5 rows x 102 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取文件'events_new.csv'，得到训练集和测试集中出现的event及对应的101列词频特征\n",
    "\n",
    "events = pd.read_csv('events_new.csv').drop('Unnamed: 0',axis=1)\n",
    "events.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1125, 102)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "events.shape "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.  对事件进行聚类和计算CH_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将训练集合拆分成训练集和校验集，在校验集上找到最佳的模型超参数 \n",
    "\n",
    "y_train = events['event_id']\n",
    "X_train = events.drop('event_id',axis=1)\n",
    "\n",
    "# 忽略错误信息\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train,y_train, train_size = 0.8,random_state = 0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(900, 101)\n",
      "(225, 101)\n"
     ]
    }
   ],
   "source": [
    "#拆分后的训练集和校验集的样本数目\n",
    "\n",
    "print(X_train_part.shape)\n",
    "print(X_val.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义一个聚类数为K的函数，评价聚类算法性能\n",
    "\n",
    "def K_cluster_analysis(K, X_train, y_train, X_val, y_val): \n",
    "    \n",
    "    mb_kmeans = MiniBatchKMeans(n_clusters = K)\n",
    "    mb_kmeans.fit(X_train)           \n",
    "    \n",
    "    y_val_pred = mb_kmeans.predict(X_val)\n",
    "\n",
    "    CH_score = metrics.silhouette_score(X_train,mb_kmeans.predict(X_train))\n",
    "    v_score = metrics.v_measure_score(y_val,y_val_pred)\n",
    "     \n",
    "    print('CH_score of train for K = %d: '%K,CH_score)\n",
    "    print('v_score of test for K = %d: '%K,v_score)\n",
    "    \n",
    "    return CH_score,v_score \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CH_score of train for K = 5:  0.6356180543213094\n",
      "v_score of test for K = 5:  0.335346801203611\n",
      "CH_score of train for K = 10:  0.22612974418391102\n",
      "v_score of test for K = 10:  0.525797215445032\n",
      "CH_score of train for K = 15:  0.43047638248060266\n",
      "v_score of test for K = 15:  0.5227642544540628\n",
      "CH_score of train for K = 20:  0.251464569394516\n",
      "v_score of test for K = 20:  0.639023842870579\n",
      "CH_score of train for K = 30:  0.15124185526715522\n",
      "v_score of test for K = 30:  0.6627740731181366\n",
      "CH_score of train for K = 40:  0.16976810217089344\n",
      "v_score of test for K = 40:  0.7425470036413536\n",
      "CH_score of train for K = 50:  0.25130997689547674\n",
      "v_score of test for K = 50:  0.7659929503991995\n",
      "CH_score of train for K = 60:  0.18547735165735907\n",
      "v_score of test for K = 60:  0.7495584159312801\n",
      "CH_score of train for K = 70:  0.22308691867406538\n",
      "v_score of test for K = 70:  0.7927662948450592\n",
      "CH_score of train for K = 80:  0.18685737849265416\n",
      "v_score of test for K = 80:  0.7774750569498061\n",
      "CH_score of train for K = 90:  0.2384704231426174\n",
      "v_score of test for K = 90:  0.8057578218840628\n",
      "CH_score of train for K = 100:  0.20504406173587378\n",
      "v_score of test for K = 100:  0.8088623834636567\n"
     ]
    }
   ],
   "source": [
    "# 查看不同聚类数K时训练集和测试集的CH_score\n",
    "    \n",
    "Ks = [5,10,15,20,30,40,50,60,70,80,90,100]\n",
    "CH_scores = []\n",
    "v_scores = []\n",
    "for K in Ks:\n",
    "    ch,v = K_cluster_analysis(K, X_train_part, y_train_part, X_val, y_val)\n",
    "    CH_scores.append(ch)\n",
    "    v_scores.append(v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'v_scores')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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D34Q47mzXVt77bWo7X7mmUim775bCbV8U3WtVPfsGSOEtFItIiJSFNOnRxeP22+P1d4hQ6J2+thjYZVV8v98ZrDhhnE655wYyPLkk00r2PffH6UkO+wQddj77x8r2i0d7OgOt90Gp58Oa6wBL7wQ5SYiLamulWozjSoXEREpsGXLIpE96KCol776athtt1iRHj8+SjMKkVC3pFev6NJx113w0Ufw8stxgOPChXD++bDZZjBwIJxySpSPpEZZfPUVHH88nHwy7L57HCSphFraUl0r1aCkWkREpEC++CJKI0aMgLq6KL8477xITAcMSDq6WKHebrs4XXZZHOw4enQk0/fcEyvqK64YNd4ffADvvgsXXwy//CV07px09FLqlFSLiIhITt59NxLpe++NqYLbbx8/H3541DuXqrXWgh//OE6LFsHzzzcd7LhgQfy8775JRynlovqS6poamDkz6ShERETK2pIl8PDDUR/9/PORPP/gB1HasfXWSUeXvRVWgL33jtO118Z1GjUu2ai+pLq2Ft55J+koREREytJHH8XBezffHOUTAwfCVVdFa7tVV006uvxQMi0dUZ1Jtco/REREsnbRRTGsZckS+M534JZbojxC9cYi1ZpUz58fe4SuXZOORkREpCyMGgWXXw7f/34c5LfBBklHJFJaqjOphhgAs9pqycYiIiJSBj7+OA7m22KL6JLRrVvSEYmUnupNqj/7TEm1iIhIO9zhhBNg3jx49lkl1CKtqe6kWkRERNp0663RWu6662CTTZKORqR0VddERYiWeqCkWkREpB11dTHqe6+94LTTko5GpLRVX1KdXlMtIiIiLVqyBI49Nvo333lnTCMUkdap/ENERES+4cor4dVXYeRI6Ncv6WhESl/1fe7s1Su6uiupFhERadHLL8MVV8RK9eGHJx2NSHmovqS6c2fo3VtJtYiISAu+/BKOOQb694cbbkg6GpHyUX3lH6CpiiIiIq045xyYOhWeey6+3BWRzFTfSjVEBxAl1SIiIssZNQpuuw1+/nPYddekoxEpL9WZVNfWqvuHiIhImvSpiZddlnQ0IuWness/pk1LOgoREZGS4B4JtaYminRc9SbVKv8QEREBouTj0Ufh2ms1NVGko6q7/GPZsqQjERERSVR9PZx9Nuy5J5x+etLRiJSv6k2qly2L77lERESq1JIl0T5vhRXg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E6+7LulowoYbRp/sadOiVV0+Vy/feScOKDz//Og8MmFClGwUqjyiR49I4F9/PVrNHXlkPO/06fl9npdeilX3hoZoAbjHHvl9/EJaf30YNSrKblZaKbI8KYr6etVTi0hpK/RKdbuDBNz9WXf/qvHiy8TR5tIRl14af+iHt9vtqjylpibee29pLVftumvUN48ZEy3+cl3dXbIkSly23jraHYwcGaO1i5XAbb55HJR37bXw/PPR//raa/PTAeORR2JVvE+fSK433zz3x0zCPvvAv/8dHz6kKOrqVPohIqWt0El1u4MEmjkB+GdBI6pkffvGZLh//jNOleTvf2+amrjzzklH802pg/3+9Kd4Dzrq3/+OftMXXxwlERMmwOGH5y/OTHXuHL24x4+H3XaLns3bbx+9nDvqzjtjNX+TTeDFF2HQoPzFm4RSOaCyCsybBx9/rJVqESlthU6q2xwksNyGZscAw4CrW7k974MEKtJpp8VX1MOHV06LvQ8/LM7UxFydfz6ccAJccUV8AMjGokXR1m7bbSN7eOihSND79ClMrJlaZ50YdvPAA7FqPmxYfLD56qv275viHvXIP/pRrFI/+2x8ABTJkA5SFJFyUOikur1BAgCY2Z7ABUS/0xaLUvM9SKBidesWLfbeey/6/ZY790hUFywoztTEXJjFQJq99or69iefzOx+r74aHxiuvDJaBU6YAAcd1P79isUMvv/9+J06/vjofLHpppm9vmXLYsX7ggvitY0aFSVKIllIJdVaqRaRUlbopLrNQQIAZrYlcAuRUH9S4Hiqw3e/G2OXL74Y5s5NOprcJDE1MRddu8Kf/xyxHnZYHGzYmoUL4ec/hx12iO+3R4+OzhvFGs2drdpauO22WGnu0gX23jv6Nn/6acvbL1oERx0Vo7+HD4/WfaX8oUhKVqpH9XrrJRuHiEhbCppUZzhI4GpgJeDPZvammX2jF6pkyQyuuQY+/zwOeCtXEycmNzUxF716wT/+AT17wv77tzws5MUXYYst4sPCCSfEVMR99y1+rB2x++7w1ltRrnL//fEB4r77lj9Ac968aDM4cmS8xt/+NobmiHRAfX00/Sn25HoRkWwU/K9ce4ME3H1Pd1/d3bdoPCU6tatibLZZDPG48cYYXFFuFi+OcoEePZKZmpirtdeOxPqzz6It3ZdfxvULFkQXk112idf45JMx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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f140a6d2358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制不同聚类数目K下的CH_score和v_score,找到最佳模型／参数（分数最高）\n",
    "\n",
    "plt.figure(figsize=(12,5))\n",
    "plt.subplot(121)\n",
    "plt.plot(Ks,np.array(CH_scores),'r-')\n",
    "plt.xlabel('Ks')\n",
    "plt.ylabel('CH_scores')\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.plot(Ks,np.array(v_scores),'b-')\n",
    "plt.xlabel('Ks')\n",
    "plt.ylabel('v_scores')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分析：\n",
    "\n",
    "1. 采用train_test_split将集合拆分成训练集和校验集，对训练集事件的101维属性在不同聚类数K下进行聚类，并在校验集上进行评估。     \n",
    "2. 当聚类书k变化时，CH-scores先是减小，然后在增大，继续随着K值的变化振荡，当K取5时CH-scores取得最大值，参数还有待调整    \n",
    "3. 当聚类数K变化的时候，开始时v_score随着K的增大而迅速增大，当聚类数K超过30以后，v_score随着K的增大而缓慢增大，v_score大于0.7。     \n",
    "4. 内部评价法CH_score和外部评价法v_score曲线升降相反可能是没有进行数据归一化处理，也可能是其它原因"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.  结果显示/分析 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsMAAAEyCAYAAAAfqt1jAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X98nFWd9//XaTvBSb3Tgpkq1jIjPzdZWkFKQFtd1CaAW5bqChqo0v2Oi+KmS7a6/mi7wI2l7u4Dalx5AOI9rnXbDLC3WqCLEoqgNEqTYrttbdaK3JMKVHJFaZQkkmlzvn9ck2YmmaRXkpnMr/fz8cjjSk5PrutccyUnn54553OMtRYRERERkVI0I9cNEBERERHJFQXDIiIiIlKyFAyLiIiISMlSMCwiIiIiJUvBsIiIiIiULAXDIiIiIlKyFAyLiIiISMlSMCwiIiIiJUvBsIiIiIiUrFnTebHKykobCoWm85IiIhnx3HPPdVtrA7lux3RSny0ihcxrvz2twXAoFGL37t3TeUkRkYwwxnTmug3TTX22iBQyr/22pkmIiIiISMlSMCwiIiIiJUvBsIiIiIiULAXDIiIiIlKyFAyLiIiISMlSMCwiIiIiJUvBsIiIiIiULAXDIiIiIlKyFAyLSF5yHIf29nYcx8l1U0REpIgpGBaRvBONRgkGg9TW1hIMBolGo7luksg0cYD2xFFEpoOCYRHJK47jEA6H6e/vp6enh/7+fsLhsEaIpQREgSBQmzjqP4Ei00HBsIjklVgsRllZWUqZz+cjFovlpkEi08IBwkA/0JM4htEIsUj2KRgWkbwSCoUYGBhIKYvH44RCodw0SGRaxICyEWW+RLmIZJOCYRHJK4FAgEgkgt/vp6KiAr/fTyQSIRAI5LppIlkUAgZGlMUT5SKSTbNy3QARkZHq6+tZtmwZsViMUCikQFhKQACI4E6N8OEGwpFEuYhkk4JhEclLgUBAQbCUmHpgGe7UiBAKhEWmh4JhERGRvBFAQbDI9NKcYREREREpWQqGRURERKRkKRgWERERkZKlYFhERERESpaCYRGRImKMWWCMecoY02GM+YUx5uZE+WnGmCeMMb9KHE/NdVtFRPKBgmERkeJyDPistbYKuBT4O2NMNfBF4Elr7TnAk4mvRURKnoJhEZEiYq09Yq39eeLzPwIdwHzgamBzotpmYEVuWigikl8UDIuIFCljTAi4ENgFvNlaewTcgBmYN8b33GiM2W2M2e04znQ1VUQkZxQMi4gUIWPMG4HvAo3W2j94/T5r7f3W2sXW2sXaAVBESoGCYRGRImOM8eEGwluttd9LFL9ijDk98e+nA125ap+ISD5RMCwiUkSMMQaIAB3W2k1J//QIcEPi8xuAh6e7bSIi+WhWrhsgIiIZtQT4OLDfGLM3UbYW+GfgIWNMGDgMXJOj9omI5BUFwyIiRcRauxMwY/zzB6azLSIiheCk0ySMMW8wxrQZY/47kcD9fyfK326M2ZVI4P6gMaYs+80VEREREckcL3OGXwfeb619B3ABcIUx5lLgX4CvJhK4vwqEs9dMEREREZHMO2kwbF2vJb70JT4s8H7g/ybKlcBdRERERAqOp2wSxpiZiYUYXcATwK+Bo9baY4kqL+LucJTue5XAXURERKSIOY5De3s7hRjreQqGrbXHrbUXAG8DaoCqdNXG+F4lcBcREREpUtFolGAwSG1tLcFgkGg0musmTciE8gxba48CTwOXAnONMUPZKN4GvJzZpomIiIhIPnMch3A4TH9/Pz09PfT39xMOhwtqhNhLNomAMWZu4nM/sAzoAJ4CPpKopgTuIiIiIiUmFotRVpaaUMzn8xGLxXLToEnwkmf4dGCzMWYmbvD8kLV2uzHmIPCAMWYDsAd3xyMRERERKRGhUIiBgYGUsng8TigUyk2DJuGkwbC1dh9wYZryF3DnD4uIiIhICQoEAkQiEcLhMD6fj3g8TiQSoZDWiWkHOhERERGZtPr6epYtW0YsFiMUChVUIAwKhkVERERkigKBQMEFwUMmlE1CRERERKSYKBgWERERkZKlYFhERERESpaCYREREREpWQqGRURERKRkKRgWERERkZKlYFhERERESpaCYREREREpWQqGRURERKRkKRgWERERkZKlYFhERERESpaCYREREREpWQqGRURERKRkKRgWERERkZKlYFhERERESpaCYREREREpWQqGRURERKRkKRgWERERkZKlYFhERERESpaCYREREREpWQqGRURERKRkKRgWERERkZKlYFhERERESpaCYREREREpWQqGRURERKRkKRgWERERkZJ10mDYGLPAGPOUMabDGPMLY8zNifLbjDEvGWP2Jj4+mP3mioiIiIhk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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f138df2d588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 显示聚类结果\n",
    " \n",
    "colors = ['red','blue','black','green','yellow','orange','cyan','#e24fff','#524C90','#845868'] # 每一类用一种颜色\n",
    "\n",
    "# 显示聚类数K=5时的结果\n",
    "n_clusters = 5\n",
    "mb_kmeans = MiniBatchKMeans(n_clusters = n_clusters)\n",
    "mb_kmeans.fit(X_train)\n",
    "y_train_pred = mb_kmeans.labels_ \n",
    "centers = mb_kmeans.cluster_centers_\n",
    "\n",
    "X_train = np.array(X_train)\n",
    "\n",
    "plt.figure(figsize=(12,5))\n",
    "plt.subplot(121)\n",
    "for i in range(n_clusters):\n",
    "    index = np.nonzero(y_train_pred==i)[0]\n",
    "    x = X_train[index,0]\n",
    "    y = X_train[index,1]\n",
    "    for j in range(len(x)):\n",
    "        if j<100:\n",
    "            plt.scatter(x[j],y[j],color=colors[i],s=20)\n",
    "    plt.scatter(centers[i,0],centers[i,1],marker='x',color=colors[i],s=90)\n",
    "\n",
    "plt.subplot(122)\n",
    "for i in range(n_clusters):\n",
    "    index = np.nonzero(y_train_pred==i)[0]\n",
    "    x = X_train[index,0]\n",
    "    y = X_train[index,2]\n",
    "    for j in range(len(x)):\n",
    "        if j<100:\n",
    "            plt.scatter(x[j],y[j],color=colors[i],s=20)\n",
    "    plt.scatter(centers[i,0],centers[i,1],marker='x',color=colors[i],s=90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "聚类效果看起来并不太好，虽然在聚类数K=5时，CH_score=0.6384，但是还是有些簇的点是重合在一起的"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
